package dao;

import java.util.ArrayList;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.exception.JDBCConnectionException;

import dominio.Usuario;

import excepciones.DAOExcepcion;


public class DaoUsuario {
	private static final String SQL_LISTAR_USUARIOS = "From Usuario";
	private static final String SQL_LISTAR_USUARIOS_ESNCARD = "From Usuario where esncard='";
	private static final String SQL_LISTAR_USUARIOS_EMAIL = "From Usuario where email='";
	
	private Session sesion = null; // Hibernate Session
	private Transaction tx = null; // Hibernate Transaction

	public ArrayList ListarUsuarios() throws DAOExcepcion{		
		try {
			sesion = UtilidadHibernate.getSessionFactory().openSession();
			sesion.beginTransaction();
			ArrayList ListaUsuarios = (ArrayList) sesion.createQuery(SQL_LISTAR_USUARIOS).list();
			sesion.getTransaction().commit();
			sesion.close();
			return ListaUsuarios;
		} 
		catch (JDBCConnectionException e){  // no puede conectar con la bd, error grave.
			System.out.println("Error al conectar con la base de datos " + e + "\n");
		}
		catch (HibernateException e) {
			tx.rollback();
			throw new DAOExcepcion(e);
		} 
		return null;
	}
	
	public ArrayList ListarUsuarioPorEmail(String email) throws DAOExcepcion{		
		try {
			sesion = UtilidadHibernate.getSessionFactory().openSession();
			sesion.beginTransaction();
			ArrayList ListaUsuarios = (ArrayList) sesion.createQuery(SQL_LISTAR_USUARIOS_EMAIL+email+"'").list();
			sesion.getTransaction().commit();
			sesion.close();
			return ListaUsuarios;
		} 
		catch (JDBCConnectionException e){  // no puede conectar con la bd, error grave.
			System.out.println("Error al conectar con la base de datos " + e + "\n");
		}
		catch (HibernateException e) {
			tx.rollback();
			throw new DAOExcepcion(e);
		} 
		return null;
	}

	public void anadirUsuario(Usuario usuario) throws DAOExcepcion {
		try {
			sesion = UtilidadHibernate.getSessionFactory().openSession();
			tx = sesion.beginTransaction();
			sesion.save(usuario);
			tx.commit();
		} 
		catch (JDBCConnectionException e){  // no puede conectar con la bd, error grave.
			System.out.println("Error al conectar con la base de datos " + e + "\n");
		}
		catch (HibernateException e) {
			tx.rollback();
			throw new DAOExcepcion(e);
		} 
		return;
	}

	public ArrayList recuperarUsuarioPorEsncard(String campo) throws DAOExcepcion {
		ArrayList ListaUsuarios;
		try {
			sesion = UtilidadHibernate.getSessionFactory().openSession();
			sesion.beginTransaction();
			ListaUsuarios = (ArrayList) sesion.createQuery(SQL_LISTAR_USUARIOS_ESNCARD + campo + "'").list();
			sesion.getTransaction().commit();
			sesion.close();
			return ListaUsuarios;
		} 
		catch (JDBCConnectionException e){  // no puede conectar con la bd, error grave.
			System.out.println("Error al conectar con la base de datos " + e + "\n");
		}
		catch (HibernateException e) {
			tx.rollback();
			throw new DAOExcepcion(e);
		} 
		return null;
	}
	
	public ArrayList recuperarUsuarioPorEmail(String campo) throws DAOExcepcion {
		ArrayList ListaUsuarios;
		try {
			sesion = UtilidadHibernate.getSessionFactory().openSession();
			sesion.beginTransaction();
			ListaUsuarios = (ArrayList) sesion.createQuery(SQL_LISTAR_USUARIOS_EMAIL + campo + "'").list();	
			sesion.getTransaction().commit();
			sesion.close();
			return ListaUsuarios;
		} 
		catch (JDBCConnectionException e){  // no puede conectar con la bd, error grave.
			System.out.println("Error al conectar con la base de datos " + e + "\n");
		}
		catch (HibernateException e) {
			tx.rollback();
			throw new DAOExcepcion(e);
		} 
		return null;
	}

}